/**
 * 统一的日志工具类
 * 提供美观的日志输出格式和分级日志管理
 */
export class Logger {
    /**
     * 日志级别定义
     */
    static LEVELS = {
        DEBUG: 0,
        INFO: 1,
        WARN: 2,
        ERROR: 3,
        SUCCESS: 4
    }

    /**
     * 日志样式配置
     */
    static STYLES = {
        DEBUG: {
            color: '#6c757d',
            background: '#f8f9fa',
            icon: '🔧'
        },
        INFO: {
            color: '#0066cc',
            background: '#e7f3ff',
            icon: 'ℹ️'
        },
        WARN: {
            color: '#ff6600',
            background: '#fff3e0',
            icon: '⚠️'
        },
        ERROR: {
            color: '#dc3545',
            background: '#ffeaea',
            icon: '❌'
        },
        SUCCESS: {
            color: '#28a745',
            background: '#eafaf1',
            icon: '✅'
        },
        PLUGIN: {
            color: '#6f42c1',
            background: '#f3e8ff',
            icon: '🔌'
        }
    }

    constructor(name = 'App', level = Logger.LEVELS.INFO) {
        this.name = name
        this.level = level
        this.enabled = true
    }

    /**
     * 设置日志级别
     * @param {number} level - 日志级别
     */
    setLevel(level) {
        this.level = level
    }

    /**
     * 启用/禁用日志输出
     * @param {boolean} enabled - 是否启用
     */
    setEnabled(enabled) {
        this.enabled = enabled
    }

    /**
     * 格式化时间戳
     * @returns {string} 格式化的时间字符串
     */
    _getTimestamp() {
        const now = new Date()
        return now.toLocaleTimeString('zh-CN', {
            hour12: false,
            hour: '2-digit',
            minute: '2-digit',
            second: '2-digit',
            fractionalSecondDigits: 3
        })
    }

    /**
     * 生成日志样式
     * @param {string} type - 日志类型
     * @returns {string} CSS样式字符串
     */
    _getStyle(type) {
        const style = Logger.STYLES[type] || Logger.STYLES.INFO
        return `
            color: ${style.color};
            background: ${style.background};
            padding: 2px 6px;
            border-radius: 3px;
            font-weight: 500;
            border-left: 3px solid ${style.color};
        `.replace(/\s+/g, ' ').trim()
    }

    /**
     * 输出日志的核心方法
     * @param {string} type - 日志类型
     * @param {number} level - 日志级别
     * @param {string} message - 日志消息
     * @param {...any} args - 额外参数
     */
    _log(type, level, message, ...args) {
        if (!this.enabled || level < this.level) {
            return
        }

        const timestamp = this._getTimestamp()
        const style = this._getStyle(type)
        const icon = Logger.STYLES[type]?.icon || ''
        
        const prefix = `%c${icon} [${timestamp}] ${this.name}:`
        
        if (args.length > 0) {
            console.log(prefix, style, message, ...args)
        } else {
            console.log(prefix, style, message)
        }
    }

    /**
     * 调试日志
     * @param {string} message - 日志消息
     * @param {...any} args - 额外参数
     */
    debug(message, ...args) {
        this._log('DEBUG', Logger.LEVELS.DEBUG, message, ...args)
    }

    /**
     * 信息日志
     * @param {string} message - 日志消息
     * @param {...any} args - 额外参数
     */
    info(message, ...args) {
        this._log('INFO', Logger.LEVELS.INFO, message, ...args)
    }

    /**
     * 警告日志
     * @param {string} message - 日志消息
     * @param {...any} args - 额外参数
     */
    warn(message, ...args) {
        this._log('WARN', Logger.LEVELS.WARN, message, ...args)
    }

    /**
     * 错误日志
     * @param {string} message - 日志消息
     * @param {...any} args - 额外参数
     */
    error(message, ...args) {
        this._log('ERROR', Logger.LEVELS.ERROR, message, ...args)
    }

    /**
     * 成功日志
     * @param {string} message - 日志消息
     * @param {...any} args - 额外参数
     */
    success(message, ...args) {
        this._log('SUCCESS', Logger.LEVELS.SUCCESS, message, ...args)
    }

    /**
     * 插件相关日志
     * @param {string} message - 日志消息
     * @param {...any} args - 额外参数
     */
    plugin(message, ...args) {
        this._log('PLUGIN', Logger.LEVELS.INFO, message, ...args)
    }

    /**
     * 分组开始
     * @param {string} label - 分组标签
     */
    group(label) {
        if (!this.enabled) return
        console.group(`🔗 ${label}`)
    }

    /**
     * 分组结束
     */
    groupEnd() {
        if (!this.enabled) return
        console.groupEnd()
    }

    /**
     * 性能计时开始
     * @param {string} label - 计时标签
     */
    time(label) {
        if (!this.enabled) return
        console.time(`⏱️ ${label}`)
    }

    /**
     * 性能计时结束
     * @param {string} label - 计时标签
     */
    timeEnd(label) {
        if (!this.enabled) return
        console.timeEnd(`⏱️ ${label}`)
    }

    /**
     * 表格输出
     * @param {Array|Object} data - 要显示的数据
     */
    table(data) {
        if (!this.enabled) return
        console.table(data)
    }
}

/**
 * 创建日志实例的工厂函数
 * @param {string} name - 日志器名称
 * @param {number} level - 日志级别
 * @returns {Logger} 日志器实例
 */
export function createLogger(name, level = Logger.LEVELS.INFO) {
    return new Logger(name, level)
}

/**
 * 全局默认日志器
 */
export const logger = new Logger('Editor')

/**
 * 环境检测，在生产环境中自动调整日志级别
 */
if (typeof window !== 'undefined' && window.location.hostname !== 'localhost' && window.location.hostname !== '127.0.0.1') {
    // 生产环境，只显示警告和错误
    logger.setLevel(Logger.LEVELS.WARN)
}